﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text;
using System.Data;
using TracNghiemTinHocDaiCuong.BIZ;
using TracNghiemTinHocDaiCuong.Common;
using TracNghiemTinHocDaiCuong.ThucThe;

namespace TracNghiemTinHocDaiCuong
{
    public partial class TestThu : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            int idDe = Methods.ConvertNumber(Session["maDe"].ToString());
            DeThi deThi = DeThiBIZ.TimTheoId(idDe);
            Session["SoCauHoi"] = deThi.SoCauHoi;
            Session["ThoiGian"] = deThi.ThoiGian;
            int thoiGian = Methods.ConvertNumber(Session["ThoiGian"].ToString());
            
            if (IsPostBack)
            {
                LayLuaChonTuNguoiDung();
                DuaLuaChonVeTrang();
            }

            //Khởi tạo số câu chưa làm trong lần load bài test lần đầu tiên (từ 1 -> số câu hỏi)
            if (!IsPostBack)
            {
                if (!sm.IsInAsyncPostBack)
                    Session["timeout"] = DateTime.Now.AddMinutes(1).ToString();
                int i = 1;
                while (i < deThi.SoCauHoi)
                {
                    lblCauChuaLam.Text += i + ", ";
                    i++;
                }
                lblCauChuaLam.Text += deThi.SoCauHoi;
            }
        }

        private void LayLuaChonTuNguoiDung()
        {
            string luaChon = ((ViewState["selections"] != null) ? ViewState["selections"].ToString() : "");
            foreach (ListViewDataItem item in lvTest.Items)
            {
                RadioButton rdoDapAnA = (RadioButton)item.FindControl("rdoDapAnA");
                RadioButton rdoDapAnB = (RadioButton)item.FindControl("rdoDapAnB");
                RadioButton rdoDapAnC = (RadioButton)item.FindControl("rdoDapAnC");
                RadioButton rdoDapAnD = (RadioButton)item.FindControl("rdoDapAnD");
                HiddenField hfMaCH = (HiddenField)item.FindControl("hdfMaCH");
                string MaCH = hfMaCH.Value;
                char dapAn = 'N';

                if (rdoDapAnA.Checked) dapAn = 'A';
                else if (rdoDapAnB.Checked) dapAn = 'B';
                else if (rdoDapAnC.Checked) dapAn = 'C';
                else if (rdoDapAnD.Checked) dapAn = 'D';
                else dapAn = 'N';

                string pattern = string.Format("{0}=", MaCH);

                //Để thay đổi đáp án của câu nào đó khi chuyển trang
                if (luaChon.Contains(pattern))
                {
                    int replaceIndex = luaChon.IndexOf(pattern) + pattern.Length;
                    StringBuilder sb = new StringBuilder(luaChon);
                    sb[replaceIndex] = dapAn;
                    luaChon = sb.ToString();
                }
                else
                {
                    if (luaChon.Length == 0)
                    {
                        luaChon += MaCH + "=" + dapAn;
                    }
                    else
                    {
                        luaChon += "," + MaCH + "=" + dapAn;
                    }
                }
            }
            ViewState["selections"] = luaChon;
        }

        protected void lvTest_PagePropertiesChanged(object sender, EventArgs e)
        {
            LayLuaChonTuNguoiDung();
            lvTest.DataBind();
        }

        protected void dpTest_PreRender(object sender, EventArgs e)
        {
            int idDe = Methods.ConvertNumber(Session["maDe"].ToString());
            lvTest.DataSource = DeThi_CauHoiBIZ.LayDanhSach(idDe);
            lvTest.DataBind();
            DuaLuaChonVeTrang();
        }        

        private void DuaLuaChonVeTrang()
        {
            string luaChon = (ViewState["selections"] != null) ? ViewState["selections"].ToString() : "";
            foreach (ListViewDataItem item in lvTest.Items)
            {
                RadioButton rdoDapAnA = (RadioButton)item.FindControl("rdoDapAnA");
                RadioButton rdoDapAnB = (RadioButton)item.FindControl("rdoDapAnB");
                RadioButton rdoDapAnC = (RadioButton)item.FindControl("rdoDapAnC");
                RadioButton rdoDapAnD = (RadioButton)item.FindControl("rdoDapAnD");
                HiddenField hfMaCH = (HiddenField)item.FindControl("hdfMaCH");
                string MaCH = hfMaCH.Value;
                string pattern = string.Format("{0}=", MaCH);
                if (luaChon.Contains(pattern))
                {
                    int replaceIndex = luaChon.IndexOf(pattern) + pattern.Length;
                    char dapAn = luaChon[replaceIndex];
                    switch (dapAn)
                    {
                        case 'A':
                            rdoDapAnA.Checked = true;
                            break;
                        case 'B':
                            rdoDapAnB.Checked = true;
                            break;
                        case 'C':
                            rdoDapAnC.Checked = true;
                            break;
                        case 'D':
                            rdoDapAnD.Checked = true;
                            break;
                        default:
                            break;
                    }
                }
            }
        }

        protected void btnGui_Click(object sender, EventArgs e)
        {
            TraKetQua();   
        }

        private void TraKetQua()
        {
            LayLuaChonTuNguoiDung();
            string ketQua = ViewState["selections"].ToString();
            List<string> rdoSelections = new List<string>();
            //Thêm kết quả bài làm của người dùng

            int maDe = Methods.ConvertNumber(Session["maDe"].ToString());
            DataTable table = DeThi_CauHoiBIZ.LayDanhSach(maDe);

            foreach (DataRow row in table.Rows)
            {
                string MaCH = row["MaCH"].ToString();
                string pattern = string.Format("{0}=", MaCH);
                if (ketQua.Contains(pattern))
                {
                    int index = ketQua.IndexOf(pattern);
                    int replaceIndex = index + pattern.Length;
                    rdoSelections.Add(ketQua[replaceIndex].ToString());
                }
                else
                {
                    rdoSelections.Add("N");
                }
            }

            BaiLam baiLam = new BaiLam();
            baiLam.DapAnND = string.Join("", rdoSelections.ToArray());
            IList<string> danhSachDapAn = DeThi_CauHoiBIZ.LayKetQua(maDe);
            Session["Diem"] = TinhDiemBaiLam(danhSachDapAn, rdoSelections).ToString();
            baiLam.Diem = Methods.ConvertNumber(Session["Diem"].ToString());

            //Giải quyết vấn đề nếu người làm bài test là Khách --> Không lưu lại kết quả làm bài.
            if (Session["idNguoiDung"] != null)
            {
                int idNguoiDung = (int)Session["idNguoiDung"];
                baiLam.MaND = idNguoiDung;
                baiLam.MaDT = maDe;
                baiLam.NgayLamBai = DateTime.Now;
                Session["MaBL"] = BaiLamBIZ.Them(baiLam);
            }
            else
            {
                Session["BaiLam"] = baiLam.DapAnND;
            }
            Response.Redirect("KetQua.aspx");
        }

        private float TinhDiemBaiLam(IList<string> danhSachDapAn, IList<string> danhSachChon)
        {
            float diem = 0;
            float soCauHoi = Methods.ConvertNumber(Session["SoCauHoi"].ToString());
            float diemMoiCau = 10 / soCauHoi;
            for (int i = 0; i < danhSachChon.Count; i++)
            {
                if (danhSachChon[i].ToString() == danhSachDapAn[i].ToString())
                {
                    diem += diemMoiCau;
                }
            }
            return diem;
        }

        private List<String> LayChuoiBaiLam()
        {
            string ketQua = (ViewState["selections"] == null) ? "" : ViewState["selections"].ToString();
            List<string> rdoSelections = new List<string>();
            //Thêm kết quả bài làm của người dùng

            int maDe = Methods.ConvertNumber(Session["maDe"].ToString());
            DataTable table = DeThi_CauHoiBIZ.LayDanhSach(maDe);

            foreach (DataRow row in table.Rows)
            {
                string MaCH = row["MaCH"].ToString();
                string pattern = string.Format("{0}=", MaCH);
                if (ketQua.Contains(pattern))
                {
                    int replaceIndex = ketQua.IndexOf(pattern) + pattern.Length;
                    rdoSelections.Add(ketQua[replaceIndex].ToString());
                }
                /*Giải quyết trường hợp nếu chỉ làm trang đầu tiên, thì 
                 phương thức LayLuaChonTuNguoiDung() chỉ duyệt mỗi trang hiện tại.
                 Nó không duyệt những phần còn lại của trang khác. Nên phải add giá trị 
                 N đối với các câu thuộc các trang còn lại.
                 */
                else
                {
                    rdoSelections.Add("N");
                }
            }
            return rdoSelections;
        }

        protected void timer1_tick(object sender, EventArgs e)
        {
            if (0 > DateTime.Compare(DateTime.Now, DateTime.Parse(Session["timeout"].ToString())))
            {
                string phut = Session["timeout"].ToString();
                int m = (Int32)DateTime.Parse(phut).Subtract(DateTime.Now).TotalMinutes;
                int s = (Int32)DateTime.Parse(phut).Subtract(DateTime.Now).TotalSeconds;
                int giayConLai = s - m * 60;
                if (giayConLai >= 10 && m >= 10)
                    lblTimer.Text = m + ":" + giayConLai;
                else if (giayConLai >= 10 && m < 10)
                    lblTimer.Text = "0" + m + ":" + giayConLai;
                else
                    lblTimer.Text = "0" + m + ":" + "0" + giayConLai;
                List<String> baiLam = LayChuoiBaiLam();
                lblCauDaLam.Text = "";
                lblCauChuaLam.Text = "";
                int chiSoKtN = baiLam.Count - 1;
                while (chiSoKtN >= 0 && baiLam[chiSoKtN] != "N") chiSoKtN--;
                int chiSoKhacN = baiLam.Count - 1;
                while (chiSoKhacN >= 0 && baiLam[chiSoKhacN] == "N") chiSoKhacN--;

                for (int i = 0; i < baiLam.Count; i++)
                {
                    if (baiLam[i] == "N")
                    {
                        if (i != chiSoKtN)
                            lblCauChuaLam.Text += (i + 1) + ", ";
                        else
                            lblCauChuaLam.Text += (i + 1);
                    }
                    else
                    {
                        if (i != chiSoKhacN)
                            lblCauDaLam.Text += (i + 1) + ", ";
                        else
                            lblCauDaLam.Text += (i + 1);
                    }
                }
            }
            else
            {
                foreach (ListViewDataItem item in lvTest.Items)
                {
                    RadioButton rdoDapAnA = (RadioButton)item.FindControl("rdoDapAnA");
                    RadioButton rdoDapAnB = (RadioButton)item.FindControl("rdoDapAnB");
                    RadioButton rdoDapAnC = (RadioButton)item.FindControl("rdoDapAnC");
                    RadioButton rdoDapAnD = (RadioButton)item.FindControl("rdoDapAnD");
                    rdoDapAnA.Enabled = false;
                    rdoDapAnB.Enabled = false;
                    rdoDapAnC.Enabled = false;
                    rdoDapAnD.Enabled = false;
                }
                btnGui.Enabled = false;
                TraKetQua();
            }
        }
    }
}